package com.growthgate.bootcommon.common.base;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * BaseService
 *
 * @author GrowthGate
 * @date 2019/12/4
 */
public interface BaseService<T extends BaseEntity> {

    /**
     * 根据id查询
     *
     * @param id id
     * @return 对应的实体
     */
    @Nullable T findById(@Nullable Long id);

    /**
     * 根据id批量查询
     *
     * @param ids id列表
     * @return 实体列表
     */
    @NotNull List<T> findByIds(@Nullable List<Long> ids);

    /**
     * 根据id批量查询
     *
     * @param ids id列表
     * @return 实体列表
     */
    @NotNull List<T> findByIds(@Nullable Long... ids);

    /**
     * 查询
     *
     * @param entity 查询条件
     * @return 实体列表
     */
    @NotNull List<T> find(@NotNull T entity);

    /**
     * 查询
     *
     * @param entity       查询条件
     * @param sortProperty 排序字段
     * @param isAsc        是否升序
     * @return 实体列表
     */
    @NotNull List<T> find(@NotNull T entity, @NotNull String sortProperty, boolean isAsc);

    /**
     * 获取全部数据
     *
     * @return 实体列表
     */
    @NotNull List<T> findAll();

    /**
     * 获取全部数据
     *
     * @param sortProperty 排序字段
     * @param isAsc        是否升序
     * @return 实体列表
     */
    @NotNull List<T> findAll(@NotNull String sortProperty, boolean isAsc);

    /**
     * 查询数据总数
     *
     * @return 数据总数
     */
    long count();

    /**
     * 查询数据总数
     *
     * @param entity 查询条件
     * @return 数据总数
     */
    long count(@NotNull T entity);

    /**
     * 分页获取全部数据
     *
     * @param pageNum  页数
     * @param pageSize 每页大小
     * @return 实体列表
     */
    @NotNull Page<T> page(int pageNum, int pageSize);

    /**
     * 分页获取全部数据
     *
     * @param pageNum      页数
     * @param pageSize     每页大小
     * @param sortProperty 排序字段
     * @param isAsc        是否升序
     * @return 实体列表
     */
    @NotNull Page<T> page(int pageNum, int pageSize, @NotNull String sortProperty, boolean isAsc);

    /**
     * 分页查询
     *
     * @param entity   查询条件
     * @param pageNum  页数
     * @param pageSize 每页大小
     * @return 实体列表
     */
    @NotNull Page<T> page(@NotNull T entity, int pageNum, int pageSize);

    /**
     * 分页查询
     *
     * @param entity       查询条件
     * @param pageNum      页数
     * @param pageSize     每页大小
     * @param sortProperty 排序字段
     * @param isAsc        是否升序
     * @return 实体列表
     */
    @NotNull Page<T> page(@NotNull T entity, int pageNum, int pageSize, @NotNull String sortProperty, boolean isAsc);

    /**
     * 保存实体
     *
     * @param entity 要保存的对象
     * @return 保存后的对象
     */
    @NotNull T save(@NotNull T entity);

    /**
     * 保存所有实体
     *
     * @param list 要保存的对象
     * @return 保存后的对象
     */
    @NotNull List<T> saveAll(@NotNull List<T> list);

    /**
     * 根据id删除
     *
     * @param id id
     */
    void deleteById(@NotNull Long id);

    /**
     * 根据id批量删除
     *
     * @param ids id列表
     */
    void deleteByIds(@Nullable List<Long> ids);

    /**
     * 根据id批量删除
     *
     * @param ids id列表
     */
    void deleteByIds(@Nullable Long... ids);

}